/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkgMetodoPyramid.pkgNegocio;

import java.util.ArrayList;
import net.sf.jasperreports.engine.JRException;
import pkgMetodoPyramid.pkgMetodo.InputPyramid;
import pkgMetodoPyramid.pkgMetodo.MethodPyramid;
import pkgMetodoPyramid.pkgMetodo.OutputPyramid;
import pkgMetodoPyramid.pkgPersistencia.BDataPASPyramidFile;
import pkgMetodoPyramid.pkgPersistencia.GestorFilePyramid;
import pkgMetodoPyramid.pkgPersistencia.PASPyramidFile;
import pkgMetodoPyramid.pkgPresentacion.PllaPyramid;
import pkgMetodoPyramid.pkgReporte.BDataRptChart;
import pkgMetodoPyramid.pkgReporte.GestorGraficos;
import pkgMetodoPyramid.pkgReporte.ProcessGraphException;
import pkgMetodoPyramid.pkgSoporte.Constants;
import pkgMetodoPyramid.pkgSoporte.ENUM_METODO_PYRAMID;
import pkgUtil.pkgSupportFile.ReadPASFileException;
import pkgUtil.pkgSupportFile.SavePASFileException;

/**
 *
 * @author Administrador
 */
public class GestorPyramid {

    private ReqRespPyramid reqRespCurrentCalculo = null;
    private ReqRespPyramid reqRespDefault = null;
    private EntityPyramid actualGAbierto = null;

    public GestorPyramid() {
        reqRespCurrentCalculo = new ReqRespPyramid();
    }

    public ReqRespPyramid getReqRespDefault() {
        reqRespDefault = new ReqRespPyramid();
        for (int i = 0; i < Constants.CANTENTITYDEFAULT; i++) {
            EntityPyramid entity = new EntityPyramid();
            entity.setEdad(Constants.GRUPOSEDADDEFAULT[i]);
            reqRespDefault.addEntityPyramid(entity);
        }
        setActualGAbierto(reqRespDefault.getGrupoAbierto());
        return reqRespDefault;
    }

    public void newCalculo() {
        reqRespCurrentCalculo = new ReqRespPyramid();
    }

    public void setDataCalculo(Integer totalVarones, Integer totalMujeres, Integer totalPoblacion, EntityPyramid p) throws Exception {
        formatEntity(p);
        InputPyramid input = new InputPyramid();
        input.setEntity(p);
        input.setTotalVarones(totalVarones);
        input.setTotalMujeres(totalMujeres);
        input.setTotalPablacion(totalPoblacion);
        OutputPyramid output = MethodPyramid.calcular(input);
        p = output.getEntity();
        reqRespCurrentCalculo.addEntityPyramid(output.getEntity());
    }

    private void formatEntity(EntityPyramid p) {
        if (p.getVarones() == null) {
            p.setVarones(new Integer("0"));
        }

        if (p.getMujeres() == null) {
            p.setMujeres(new Integer("0"));
        }
    }

    public boolean validarTotales(Integer totalVarones, Integer totalMujeres, Integer totalPoblacion, ArrayList colErrores) {
        boolean res = true;
        if (!MethodPyramid.validarTotal(totalVarones)) {
            colErrores.add(ENUM_METODO_PYRAMID.ERROR_INPUT.ERROR_INVALID_TOTALVARONES.toString());
        }
        if (!MethodPyramid.validarTotal(totalMujeres)) {
            colErrores.add(ENUM_METODO_PYRAMID.ERROR_INPUT.ERROR_INVALID_TOTALMUJERES.toString());
        }
        if (!MethodPyramid.validarTotal(totalPoblacion)) {
            colErrores.add(ENUM_METODO_PYRAMID.ERROR_INPUT.ERROR_INVALID_TOTALPOBLACION.toString());
        }

        if (!colErrores.isEmpty()) {
            res = false;
        }

        return res;
    }

    /**
     * @return the reqResp
     */
    public ReqRespPyramid getReqResp() {
        return reqRespCurrentCalculo;
    }

    /**
     * @param reqResp the reqResp to set
     */
    public void setReqResp(ReqRespPyramid reqResp) {
        this.reqRespCurrentCalculo = reqResp;
    }

    public boolean esGrupoAbiertoValido(EntityPyramid entity) {
        if (entity.getGrupoAbierto() >= Constants.MINGRUPOABIERTO) {
            return true;
        }
        return false;
    }

    public boolean esGrupoAbiertoActual(EntityPyramid entity) {
        if (actualGAbierto == null) {
            return false;
        }
        if (actualGAbierto.getGrupoAbierto() == entity.getGrupoAbierto()) {
            return true;
        }
        return false;
    }

    public boolean esMinGrupoAbiertoActual(EntityPyramid entity) {
        if (entity.getGrupoAbierto() == Constants.MINGRUPOABIERTO) {
            return true;
        }
        return false;
    }

    public int getCantGruposToActualGrupoAbierto(EntityPyramid entity) {
        int gAbierto = entity.getGrupoAbierto();
        int gAbiertoActual = actualGAbierto.getGrupoAbierto();
        int diferencia = gAbiertoActual - gAbierto;
        int cantidad = diferencia / Constants.RANGOLIMINFERIOR;
        if (cantidad < 0) {
            cantidad = cantidad * -1;
        }
        return cantidad;
    }

    public boolean agregarIntervalos(EntityPyramid entity) {
        int gAbierto = entity.getGrupoAbierto();
        int gAbiertoActual = actualGAbierto.getGrupoAbierto();
        if (gAbiertoActual < gAbierto) {
            return true;
        }
        return false;
    }

    /**
     * @param actualGAbierto the actualGAbierto to set
     */
    public void setActualGAbierto(EntityPyramid actualGAbierto) {
        this.actualGAbierto = actualGAbierto;
    }

    public void generarGraficos(Integer totalVarones,
            Integer totalMujeres,
            Integer total,
            String titulo,
            String subTitulo) throws ProcessGraphException, JRException {

        BDataRptChart dataRptChart = new BDataRptChart();
        dataRptChart.setReqRespPyramid(this.reqRespCurrentCalculo);
        dataRptChart.setTotal(total);
        dataRptChart.setTotalVarones(totalVarones);
        dataRptChart.setTotalMujeres(totalMujeres);
        dataRptChart.setTitulo(titulo);
        dataRptChart.setSubTitulo(subTitulo);

        GestorGraficos gestorGraficos = new GestorGraficos(dataRptChart);
        gestorGraficos.mostrarGraficos();

    }

    public PASPyramidFile grabarArchivo(PllaPyramid plla,
            Integer totalVarones,
            Integer totalMujeres,
            Integer total,
            String titulo,
            String subTitulo) throws SavePASFileException {

        BDataPASPyramidFile bData = new BDataPASPyramidFile();
        bData.setTotalVarones(totalVarones);
        bData.setTotalMujeres(totalMujeres);
        bData.setTotal(total);
        bData.setTitulo(titulo);
        bData.setSubTitulo(subTitulo);
        bData.setReqRespPyramid(this.reqRespCurrentCalculo);

        PASPyramidFile pasFile = GestorFilePyramid.grabarFilePyramid(plla, bData);
        return pasFile;
    }

    public PASPyramidFile leerArchivo(PllaPyramid plla) throws ReadPASFileException {
        PASPyramidFile pasFile = GestorFilePyramid.leerFilePyramid(plla);
        return pasFile;
    }
    
    public void cargarDatosDesdeArchivo(PASPyramidFile pasFile){
      newCalculo();
      setReqResp(pasFile.getReqRespPyramid());
      setActualGAbierto(pasFile.getReqRespPyramid().getGrupoAbierto());
    }
}
